package com.appspot.bs24event.service;

import java.util.Date;
import java.util.List;
import java.util.Map;

import org.slim3.datastore.Datastore;
import org.slim3.util.BeanUtil;

import com.appspot.bs24event.meta.EventMeta;
import com.appspot.bs24event.model.Event;
import com.google.appengine.api.datastore.Key;
import com.google.appengine.api.datastore.Transaction;

/**
 * EventServiceクラス。
 *
 * @version $Id: EventService.java 83 2011-06-10 04:16:06Z tetsu1011@gmail.com $
 */
public class EventService {

    private EventMeta meta = EventMeta.get();

    /**
     * イベント一覧を取得。
     *
     * @return List<Event>
     */
    public List<Event> getList() {
        return Datastore.query(meta).sort(meta.eventDate.desc).asList();
    }

    /**
     * 現在より過去のイベント一覧を取得。
     *
     * @return List<Event>
     */
    public List<Event> getPastList() {
        return Datastore.query(meta).filter(meta.eventDate.lessThan(new Date())).sort(meta.eventDate.desc).asList();
    }

    /**
     * 現在より先のイベント一覧を取得。
     *
     * @return List<Event>
     */
    public List<Event> getFutureList() {
        return Datastore.query(meta).filter(meta.eventDate.greaterThanOrEqual(new Date())).sort(meta.eventDate.desc).asList();
    }

    /**
     * イベントを取得。
     *
     * @return List<Event>
     */
    public Event get(Key key, Long version) {
        return Datastore.get(meta, key, version);
    }

    /**
     * イベントを登録する。
     *
     * @param input
     * @return Event
     */
    public Event insert(Map<String, Object> input) {
        Event event = new Event();
        BeanUtil.copy(input, event);
        Transaction tx = Datastore.beginTransaction();
        Datastore.put(event);
        tx.commit();
        return event;
    }

    /**
     * イベントを更新する。
     *
     * @param key
     * @param version
     * @param input
     * @return
     */
    public Event update(Key key, Long version, Map<String, Object> input) throws Exception {
        Transaction tx = Datastore.beginTransaction();
        Event event = Datastore.get(tx, meta, key, version);
        BeanUtil.copy(input, event);
        Datastore.put(event);
        tx.commit();
        return event;
    }

    /**
     * イベントを削除する。
     *
     * @param key
     * @param version
     */
    public void delete(Key key, Long version) {
        Transaction tx = Datastore.beginTransaction();
        Event event = Datastore.get(tx, meta, key, version);
        Datastore.delete(tx, event.getKey());
        tx.commit();
    }

}
